﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class FrmProductos : Form
    {

        private DataTable dtCat;
        private DataTable dtSubCat;

        private GLOBuscador buscador;

        public FrmProductos()
        {
            InitializeComponent();
        }

        #region Eventos Controles

        private void FrmProductos_Load(object sender, EventArgs e)
        {
            cargarComboBoxCat();
            cargarComboBoxSubcat();
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            limpiar();
            habilitar(true);
            txtCodBarras.Focus();
            btnBuscar.Enabled = false;
            btnNuevo.Enabled = false;
            btnEliminar.Enabled = false;
            btnCancelar.Enabled = true;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            limpiar();
            habilitar(false);
            btnBuscar.Enabled = true;
            btnNuevo.Enabled = true;
            btnEliminar.Enabled = true;
            btnCancelar.Enabled = false;
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                SCMProducto prod = new SCMProducto();
                prod.IdProducto = int.Parse(txtID.Text);
                if (prod.eliminar())
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado el producto");
                    mensaje.ShowDialog();
                    limpiar();
                    habilitar(false);
                }
                else
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                    error.ShowDialog();
                }
            }
            catch (NullReferenceException ne)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe elegir un producto, para ello oprima el botón de buscar (binoculares).\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                error.ShowDialog();
            }
            catch (FormatException fe)
            {
                GLOMensajeError error = new GLOMensajeError("No se eligió un cliente.", "Debe elegir un producto, para ello oprima el botón de buscar (binoculares).\n\n Mensaje técnico del error: " + fe.Message, "FormatException");
                error.ShowDialog();
            }
            catch (SqlException se)
            {
                GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                error.ShowDialog();
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (!btnCancelar.Enabled)
            {
                try
                {
                    DataRowView dr3 = (DataRowView)(cbSubcat.SelectedItem);
                    int subCat;
                    if (!cbxEditarCat.Checked)
                    {
                        subCat = -1;
                    }
                    else
                    {
                        subCat = int.Parse(dr3["IdSubcategoria"].ToString());
                    }
                    int gravado;
                    if (rbGravado.Checked)
                    {
                        gravado = 1;
                    }
                    else
                    {
                        gravado = 0;
                    }
                    SCMProducto prod = new SCMProducto(int.Parse(txtID.Text), subCat, txtNombre.Text, txtDesc.Text, 0, 0, txtCodBarras.Text, gravado);
                    prod.modificar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Producto actualizado con éxito");
                    mensaje.ShowDialog();
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Para actualizar un producto debe elegir uno de la lista de productos a la izquierda.\n Si desea crear uno nuevo de click en el botón \"Nuevo\". " +
                        "\n\n Si eligió uno debe elegir una subcategoría.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Mensaje técnico del error: " + ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                    error.ShowDialog();
                }
                catch (FormatException fe)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Mensaje técnico del error: " + fe.Message, "FormatException");
                    error.ShowDialog();
                }
            }
            else
            {
                try
                {
                    DataRowView dr3 = (DataRowView)(cbSubcat.SelectedItem);
                    int gravado;
                    if (rbGravado.Checked)
                    {
                        gravado = 1;
                    }
                    else
                    {
                        gravado = 0;
                    }
                    SCMProducto prod = new SCMProducto(0, int.Parse(dr3["IdSubcategoria"].ToString()), txtNombre.Text, txtDesc.Text, 0, 0, txtCodBarras.Text, gravado);
                    prod.insertar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Producto insertado con éxito");
                    mensaje.ShowDialog();
                    btnCancelar.PerformClick();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Mensaje técnico del error: " + ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe escoger proveedor, categoría y subcategoría.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                    error.ShowDialog();
                }
                catch (FormatException fe)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Debe ingresar código de barras, si no tiene ingrese 0.\n\n Mensaje técnico del error: " + fe.Message, "FormatException");
                    error.ShowDialog();
                }
            }
        }

        private void cbCat_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            cargarComboBoxSubcat();
        }

        private void cbSubcat_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!cbxEditarCat.Checked)
            {

            }
        }

        #endregion

        #region Métodos

        private void cargarComboBoxCat()
        {
            dtCat = SCMCategoria.consultar();
            cbCat.DataSource = dtCat;
            cbCat.DisplayMember = "Nombre";
            cbCat.ValueMember = "IdCategoria";
        }

        private void cargarComboBoxSubcat()
        {
            try
            {
                dtSubCat = SCMSubcategoria.consultar(int.Parse(cbCat.SelectedValue.ToString()));
                cbSubcat.DataSource = dtSubCat;
                cbSubcat.DisplayMember = "Nombre";
                cbSubcat.ValueMember = "IdSubcategoria";
            }
            catch (FormatException) { }
        }

        private void habilitar(bool Enable)
        {
            txtCodBarras.Enabled = Enable;
            txtNombre.Enabled = Enable;
            txtDesc.Enabled = Enable;
            txtCategoria.Enabled = Enable;
            cbxEditarCat.Enabled = Enable;
            cbCat.Enabled = Enable;
            cbSubcat.Enabled = Enable;
            rbExento.Enabled = Enable;
            rbGravado.Enabled = Enable;
        }

        private void limpiar()
        {
            txtID.Text = "";
            txtNombre.Text = "";
            txtDesc.Text = "";
            txtCategoria.Text = "";
            txtCodBarras.Text = "";
        }

        #endregion

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.Producto;
            buscador.FormClosed += new FormClosedEventHandler(buscador_Closed);
            buscador.ShowDialog();
        }

        private void buscador_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                txtID.Text = Cache.producto.Cells[0].Value.ToString();
                txtCodBarras.Text = Cache.producto.Cells[1].Value.ToString();
                txtNombre.Text = Cache.producto.Cells[2].Value.ToString();
                txtDesc.Text = Cache.producto.Cells[3].Value.ToString();
                txtCategoria.Text = Cache.producto.Cells[4].Value.ToString()
                    + " - " + Cache.producto.Cells[5].Value.ToString();
                habilitar(true);
            }
            catch (NullReferenceException) { }
        }

    }
}
